/*
* 装饰器 : 本质上是一个方法 : 实现性功能
*
* 装饰器是一中特殊的类型声明 就可以被附加到 类声明 方法 属性上 参数上
*
* 在不改变原方法的基础上 可以扩展原来方法的功能
*
* */

function AddAge(constructor: Function) {
  // 类.prototype.age
  constructor.prototype.age = 18;
  constructor.prototype.setAge = function () {
    constructor.prototype.age = 20;
  };
}

// Object.defineProperty({a:12},'a',{
//   writable: false
// })

function Post(params: string) {
  console.log(params);
  // target : 类的实例
  //property 此实例当前的方法
  // descriptor : undefined
  return function (target: any, property: string, descriptor: PropertyDescriptor) {
    console.log(target);
    console.log(property);
    console.log(descriptor);
    // target[property]()
  };
}


function Property() {
  // 实例本身
  // 属性的值
  return function (target: any, propertyKey: string) {
    console.log(target);
    console.log(propertyKey);
  }
}


/* 装饰参数的装饰器 */
function Query() {
  /*target 类的实例 propertyKey:方法的名字 参数的位置*/
  return function (target: any, propertyKey: string, index: number) {
    console.log('Query', target);
    console.log('Query', propertyKey);
    console.log('Query', index);
  }
}


// @AddAge就是装饰器 装饰 Person
@AddAge
class Person1 {
  @Property()
  name: string;
  // ? 可选 ! 强制
  age!: number;

  constructor() {
    this.name = '123';
  }


  setAge() {

  }

  @Post('/url')
  setName(a:number,type: number, @Query() name: string) {
    console.log(name, type, a);
  }
}

let person = new Person1();

person.setAge();
console.log(person.age);


// let a: symbol = Symbol('12');
//
// let promise: Promise<number> =
//   new Promise<number>((resolve) => {
//   resolve(123)
// })

/*
* 装饰器装饰类 :   1个参数  类本身
* 装饰器装饰方法 : 3个参数  实例,方法名字,属性描述符
* 装饰器装饰属性 : 2各参数 实例,属性的名字
* 装饰器装饰参数 : 3个参数 实例,方法名字,参数位置
* */
